import axios from 'axios';
import _ from 'lodash';
import log from 'loglevel';

const ELECTRON_VERSIONS_URL = 'https://atom.io/download/atom-shell/index.json';
const DEFAULT_CHROME_VERSION = '61.0.3163.100';

function getChromeVersionForElectronVersion(
  electronVersion,
  url = ELECTRON_VERSIONS_URL,
) {
  return axios.get(url, { timeout: 5000 }).then((response) => {
    if (response.status !== 200) {
      throw new Error(`Bad request: Status code ${response.status}`);
    }

    const { data } = response;
    const electronVersionToChromeVersion = _.zipObject(
      data.map((d) => d.version),
      data.map((d) => d.chrome),
    );

    if (!(electronVersion in electronVersionToChromeVersion)) {
      throw new Error(
        `Electron version '${electronVersion}' not found in retrieved version list!`,
      );
    }

    return electronVersionToChromeVersion[electronVersion];
  });
}

export function getUserAgentString(chromeVersion, platform) {
  let userAgent;
  switch (platform) {
    case 'darwin':
    case 'mas':
      userAgent = `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion} Safari/537.36`;
      break;
    case 'win32':
      userAgent = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion} Safari/537.36`;
      break;
    case 'linux':
      userAgent = `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion} Safari/537.36`;
      break;
    default:
      throw new Error(
        'Error invalid platform specified to getUserAgentString()',
      );
  }
  return userAgent;
}

function inferUserAgent(
  electronVersion,
  platform,
  url = ELECTRON_VERSIONS_URL,
) {
  return getChromeVersionForElectronVersion(electronVersion, url)
    .then((chromeVersion) => getUserAgentString(chromeVersion, platform))
    .catch(() => {
      log.warn(
        `Unable to infer chrome version for user agent, using ${DEFAULT_CHROME_VERSION}`,
      );
      return getUserAgentString(DEFAULT_CHROME_VERSION, platform);
    });
}

export default inferUserAgent;
